home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_09_08
/
9n08056a
< prev
next >
Wrap
Text File
|
1991-06-19
|
2KB
|
65 lines
/***************** Listing 3 *************************
Cubic Spline Interpolation
double cubic(image, x, y)
float image[4][4], x, y;
image: pointer to the four values of grid i.e.
a 4 x 4 array ( image[4][4] )
x : sample coordinate
y : line coordinate
(0,0) (0,3)
*----*----*----*
| | | |
*----*----*----*
| | o | |
*----*----*----*
| | | |
*----*----*----*
(3,0) (3,3)
If point "o" falls on upper left corner, then
return image(1,1). The point should never fall on
any of the other corners because the calling
program will ensure against this according to the
filling sequence of the array image[4][4].
Interpolation is first performed in the sample
direction and then in the line direction,
using separability.
******************************************************
#include <stdio.h>
double cubic(image, x, y)
float image[4][4], x, y;
{
register i;
float p, q;
double I_x[4];
double val = 0.0;
double a1, a2, a3, a4;
double b1, b2, b3, b4;
p = x - (int) x;
q = y - (int) y;
if( (p == 0.0) && (q == 0.0) )
return( (double) image[1][1] );
a1 = p*(1-p)(1-p); b1 = q*(1-q)(1-q);
a2 = 1 - 2*p*p + p*p*p; b2 = 1 - 2*q*q + q*q*q;
a3 = p*( 1 + p - p*p ); b3 = q*( 1 + q - q*q );
a4 = p*p*(1-p); b4 = q*q*(1-q);
for(i=0 ; i < 4 ; i++)
I_x[i] = -a1*image[i][0] + a2*image[i][1] + \
a3*image[i][2] - a4*image[i][3] ;
val = -b1*I_x[0] + b2*I_x[1] + b3*I_x[2] - b4*I_x[3];
return( val );
}